/**
 * 上传图片
 * @param {String} thumbs 照片url，多个用|分隔
 */
import BaseController from "./BaseController";
import { getCurrentTime } from "../../utils/utils";
const fs = require("fs");
const multer = require("multer");

const uploadFolder = "uploads/"; //上传目录

// 使用硬盘存储模式设置存放接收到的文件的路径以及文件名
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    // 接收到文件后输出的保存路径（若不存在则需要创建）
    //destination 用来设置上传文件的路径 可以接收一个回调函数， 或者一个字符串
    //如果传递一个回调函数的话，则需要确保路径有效
    cb(null, uploadFolder);
  },
  //filename 属性可以用来指定文件上传以后保存到服务器中的名字
  filename: function (req, file, cb) {
    // 将保存文件名设置为 时间戳 + 文件原始名，比如 151342376785-123.jpg

    let fname = file.originalname;
    let extName = "";
    //判断文件是否具有扩展名
    // if (fname.lastIndexOf(".") != -1) {
    //   extName = fname.slice(fname.lastIndexOf("."));
    // }

    //上传文件时，一般不会直接将用户的文件名直接保存的服务器中
    //一般会随机生成一个文件名
    cb(null, getCurrentTime() + "-" + fname);
  },
});

// 创建文件夹  使用此代码就是为了让我们查找磁盘中是否有该文件夹，如果没有，可以自动创建，而不是我们提前手动创建好。
// 如果不使用此代码，则我们再使用该文件夹之前，需要手动创建好当前问价夹
const createFolder = function (folder) {
  try {
    // 测试 path 指定的文件或目录的用户权限,我们用来检测文件是否存在
    // 如果文件路径不存在将会抛出错误"no such file or directory"
    fs.accessSync(folder);
  } catch (e) {
    // 文件夹不存在，以同步的方式创建文件目录。
    fs.mkdirSync(folder);
  }
};

createFolder(`./${uploadFolder}`);

const upload = multer({
  storage: storage,
  limits: {
    // (1M=1024KB，1Kb=1024B)↑200M
    fileSize: 1024 * 1024 * 200,
  },
});

class UploadPictureController extends BaseController {
  constructor() {
    super();
    this.mainMethod = this.mainMethod.bind(this);
    this.state = {
      request: null,
      response: null,
      next: null,
      uploadFolder: "uploads/", //上传目录
    };
  }

  mainMethod(req, res, next) {
    this.state.request = req;
    this.state.response = res;
    this.state.next = next;
    this.handleUpload();
  }

  async handleUpload() {
    const { response, request, uploadFolder } = this.state;
    let token = request.headers.authorzation;

    //token验证
    const verifyTokenMiddle = await this.verifyTokenMiddle(token, response);
    // token验证失败；token过期
    if (verifyTokenMiddle.status == -2) {
      response.json({
        code: -2,
        msg: verifyTokenMiddle.msg,
      });
      return;
    }

    try {
      upload.single("file")(request, response, (err) => {
        console.log("[upload ]", request.file);

        // "fieldname": "file",
        // "originalname": "2b4d58c8345976.jpg",
        // "encoding": "7bit",
        // "mimetype": "image/jpeg",
        // "destination": "upload/",
        // "filename": "1626358134979-2b4d58c8345976.jpg",
        // "path": "upload\\1626358134979-2b4d58c8345976.jpg",
        // "size": 37484

        if (err) {
          console.log("上传失败", err);
          // if (err.message == "File too large" || err.code == "LIMIT_FILE_SIZE") {
          //   res.json({
          //     status: 0,
          //     data: err,
          //     msg: "文件大小超过限制",
          //   });
          //   return;
          // }
          // res.json({
          //   status: 0,
          //   data: err,
          //   msg: "上传失败",
          // });
          return;
        }
        console.log("上传成功", request.file);
        response.json({
          code: 1,
          data: request.file,
          msg: "上传成功",
        });
      });
    } catch (error) {
      response.json({
        code: -1,
        data: error + "",
        msg: "上传失败",
      });
    }
  }
}

export default new UploadPictureController();
